'''
1 什么是递归函数
函数的递归调用是函数嵌套调用的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数
本身,称之为函数的递归调用
递归死循环是没有意义的
递归调用必须有两个明确的阶段:
        1. 回溯: 一次次递归调用下去,说白了就一个重复的过程,
        但需要注意的是每一次重复问题的规模都应该有所减少,
        直到逼近一个最终的结果,即回溯阶段一定要有一个明确的结束条件
        2. 递推: 往回一层一层推算出结果
'''
# 直接调用自己
# 内存溢出：内存不够
# def foo(n):
#     print('from foo',n)
#     foo(n+1)
# foo(0)

# 间接调用自己

# def bar():
#     print('from bar')
#     foo()
#
# def foo():
#     print('from foo')
#     bar()
# foo()
# age(5) = age(4)+2
# age(4) = age(3)+2
# age(3) = age(2)+2
# age(2) = age(1)+2
# age(1) = 18
# 第几个人定义成n,
'''
age(n) = age(n-1) + 2 # n>1
age(n) = 18           # n=1
'''

# def age(n):
#     # 所以要在这里写递归结束条件
#     # 在这个找到条件并且导致函数不再自己调用自己的时候
#     # 叫做回溯
#     # 从结束条件一步步进行返回的结果
#     # 叫做递推
#     if n == 1:
#         return 18
#     # 第一次 # age(5)=age(4)+2                 26
#     # 第二次   age(4)=age(3)+2                 24
#     # 第三次 # age(3)=age(2)+2                 22
#     # 第四次 # age(2)=age(1)+2                 20
#     # 但是我们不知道age(1)是多少
#     # 第五次 age(1)=18                   递推  18
#     return age(n-1) + 2
# print(age(5))
L = [1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]]
# 循环需要考虑次数
# for n in L:
#     if type(n) is not list:
#         print(n)
#     else:
#         # 以下是重复的过程
#         for i in n:
#             print(i)
#         else:
#             pass
def search(L):
    for n in L:
        if type(n) is not list:
            # 不是列表直接打印
            print(n)
        else:
            # 判断是列表则继续循环,判断...
            search(n)
search(L)
# 递归与循环的区别，循环每一次都要判断，需要考虑多少次
# 而递归只需要确定结束条件就行，按照规律进行重复调用，不需要考虑次数

